package com.atguigu_e_waitandnotify;

import java.io.Serial;
import java.io.Serializable;
import java.util.Objects;

/*
    顾客类 :
        1. 线程类
        2. 事物描述类 [顾客这类事物]
 */
public class Customer extends Thread implements Serializable {
    @Serial
    private static final long serialVersionUID = 3727857439407089649L;
    //姓名属性 -> 线程对象的名称代替顾客的名字 -> 不用写
    //包子属性
    private BaoZi bz;

    public Customer() {

    }

    public Customer(String name, BaoZi bz) {
        super(name);
        this.bz = bz;
    }

    public BaoZi getBz() {
        return bz;
    }

    public void setBz(BaoZi bz) {
        this.bz = bz;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Customer customer = (Customer) o;
        return Objects.equals(bz, customer.bz);
    }

    @Override
    public int hashCode() {
        return Objects.hash(bz);
    }

    @Override
    public String toString() {
        return "Customer{" +
                "bz=" + bz +
                '}';
    }

    //行为 -> 顾客类作为线程类 应该执行的任务
    @Override
    public void run() {
        //死循环 : 顾客一直吃
        while (true){
            //同步代码块 -> 保证线程执行的安全
            synchronized (bz){
                //编写顾客线程对象的任务


                //当没有包子的时候
                if (!bz.isFlag()){//bz.isFlag() == false
                    //能进来说明没有包子 --> 顾客线程就等待 -> 无线等
                    try {
                        bz.wait(); //当顾客线程执行到这一步,会释放CPU执行权和锁资源
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }

                //能从上方if走下来 说明一定有包子 [包子的状态 :  true]

                //顾客吃包子
                System.out.println("姓名是 : " + getName() + " 的顾客正在吃 " + bz.getXianer() + " 的包子  !!");
                //休眠 -> 吃包子花时间
                try {
                    //sleep 只释放CPU执行权, 不释放锁
                    Thread.sleep(500); //3秒一个包子
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                System.out.println("姓名是 : " + getName() + " 的顾客吃完了包子 , 真好吃 ! 老板 , 再来一份 !");
                System.out.println("--------------------------------------");

                //真正吃包子的语句 : 修改包子的状态
                bz.setFlag(false); //设置为false 才代表包子吃完了!

                //真正再来一份的代码 : 唤醒厨师线程
                bz.notify();
            }
        }
    }
}
